這幾天的文章會是一系列的,會需要一起看才比較能看懂整個ML模型的輪廓,
然而因為一天能寫的內容量有限,所以我會在前言部分稍微說明我寫到哪。
因為ML模型的訓練階段章節內容會分很多部分,我們要先確認好自己在哪個階段,
以免吸收新內容卻不知道用在內容的什麼地方。
★ML的整個「訓練過程」:這裡以監督式學習(Supervised Learning)為例
| 階段 | 要做的事情 | 簡介 |
|---|---|---|
(訓練前) |
決定資料集與分析資料 | 你想要預測的是什麼資料? 這邊需要先知道 example、label、features的概念。介紹可參考:【Day 15】,而我們這次作為範例的訓練資料集介紹在【Day 19】。 |
(訓練前) |
決定問題種類 | 依據資料,會知道是什麼類型的問題。regression problem(回歸問題)? classification problem(分類問題)? 此處可參考:【Day 16】、與進階內容:【Day 17】 |
(訓練前) |
決定ML模型(ML models) | 依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model)? 分類模型(Classification model)? 此處可參考:【Day 18】,神經網路(neural network)? 簡介於:【Day 25】 |
| (模型裡面的參數) | ML模型裡面的參數(parameters)與超參數(hyper-parameters) 此處可參考:【Day 18】 |
|
(訓練中) 調整模型 |
評估當前模型好壞 | 損失函數(Loss Functions):使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error), RMSE(Root Mean Squared Error), 交叉熵(Cross Entropy)為例。此處可參考:【Day 20】 |
(訓練中) 調整模型 |
修正模型參數 | 以梯度下降法 (Gradient Descent)為例:決定模型中參數的修正「方向」與「步長(step size)」此處可參考:【Day 21】 |
(訓練中) 調整腳步 |
調整學習腳步 | 透過學習速率(learning rate)來調整ML模型訓練的步長(step size),調整學習腳步。(此參數在訓練前設定,為hyper-parameter)。此處可參考:【Day 22】 |
(訓練中) 加快訓練 |
取樣與分堆 | 設定batch size,透過batch從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前設定,為hyper-parameter)。與迭代(iteration),epoch介紹。此處可參考:【Day 23】 |
(訓練中) 加快訓練 |
檢查loss的頻率 | 調整「檢查loss的頻率」,依據時間(Time-based)與步驟(Step-based)。此處可參考:【Day 23】 |
(訓練中) 完成訓練 |
(loop) -> 完成 | 重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證即可結束訓練。此處可參考:【Day 27】 |
(訓練後) |
訓練結果可能問題 | 「不適當的最小loss?」 此處可參考:【Day 28】 |
(訓練後) |
訓練結果可能問題 | 欠擬合(underfitting)?過度擬合(overfitting)? 此處可參考:【Day 26】 |
(訓練後) |
評估 - 性能指標 | 性能指標(performance metrics):以混淆矩陣(confusion matrix)分析,包含「Accuracy」、「Precision」、「Recall」三種評估指標。簡介於:【Day 28】、詳細介紹於:【Day 29】 |
(訓練後) |
評估 - 新資料適用性 | 泛化(Generalization):對於新資料、沒看過的資料的模型適用性。此處可參考:【Day 26】 |
(訓練後) |
評估 - 模型測試 | 使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試? 此處可參考:【Day 27】 |
| (資料分堆的方式) | (訓練前) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:【Day 27】 |
而今天的文章我們要來討論一下所謂的學習速率(learning rate),
可以幫我們調整學習的「步長(step size)」。
第三章節的課程地圖:(紅字標記為本篇文章中會介紹到的章節)
Gradient Descent
Troubleshooting a Loss Curve
昨日我們詳細了介紹Gradient Descent的概念,
以及Loss在參數空間所能畫出的等高圖,
今天我們要稍微更細的討論一下Loss隨著時間所變化的圖,可能會有哪些情況。
課程地圖
想像我們現在正在進行Gradient Descent的過程,
我們「修改我們ML模型的參數」依照「loss function結果的偏微分」,
我們通常會紀錄並觀察「隨著訓練時間,loss的變化」。
(這就是通常我們machine learning在做的事情)
整個ML的訓練個過程可能數小時甚至到數天,
你可以想像這樣的過程是多麼的費時,因此考慮到這點,
我們需要稍微研究一下loss curve,來看看有沒有什麼可能的困難。

(上圖是一個「常見(且我們期望的)」的loss curve與時間的對應圖。)
如同我們所想像的一樣,我們在一開始時,我們的loss下降快速,
因為我們的Gradient Descent算出較大的step size,
後來隨著時間增加,loss curve漸漸變緩和了,因為逐漸靠近loss最小值,
我們的Gradient Descent也算出較小的step size。

但loss curve還有可能有其他的樣子,不一定我們每次訓練都這麼順利。
我們也可以藉此判斷我們是否有合適的step size。
假如我們的loss curve長得像上圖這樣,
這表示我們走個幾步就跨越了好多山谷,
這也表示
step size還是太大。
自己的註:
step size只依靠「loss function的偏微分結果」,
以二維來說,是我們該點的切線斜率。
套用到三維來說,也就是我們所說的「梯度」,
表示有點類似該點的有"多"陡、往"哪裡"陡 <- 不確定能不能這樣說?
我們知道該點的「梯度」後,不見得這山就跟我們預測的一樣「直接」傾斜到山谷。
所以只靠「loss function的偏微分結果」決定的方向與步伐大小,「步伐大小不見得每次適用」。

假如我們的loss curve長得像上圖這樣,
這表示我們可能在同一個山谷裡面,但我們可能要花很久很久時間才能到谷底。
自己的註:可以看到有緩緩下降的感覺。
這也表示
step size還是太小了。

上述的這兩個例子都是step size不合適的情況,
因此,除了單純的只靠計算之外,我們還需要一個「可以縮放的參數」,
這個「可以縮放的參數」我們稱之為learning rate,
加上這個參數後,我們就有了最經典的梯度下降法(gradient descent)。

我們可以看到上圖就是最經典的梯度下降法(gradient descent)實現code,
我們可以注意到在移動變數位置時,
我們的偏微分結果乘上了「learning rate」的值,
透過「learning rate」我們可以更直接的調整我們的「參數移動大小」。
「learning rate」的調整,可以依照不同學習問題而改變,使達到最佳學習效果。
「
learning rate」也是hyperparameter的一種,設定於ML模型訓練開始前。
而為了找出「learning rate」最適合的值,
有一種方法稱為「hyperparameter tuning」,這個會在之後的章節細講。
自己的註:
「
learning rate」就是依據訓練題目有所不同而調整的值
不同的題目需要的learning rate不同,梯度下降法(gradient descent)能幫我們決定方向與步伐大概的大小,
- 但為了防止計算出的步伐太慢,可能要調整
learning rate使其加快- 也為了防止計算出的步伐太快,導致一步就走過頭,透過調整
learning rate使其變慢
通常「learning rate」會是一個小於1的分數,
而我們現在只需先簡單記得怎麼樣計算梯度下降法(gradient descent),
並將learning rate視為一個調整學習腳步的「固定參數」即可。
coursera - Launching into Machine Learning 課程
若圖片有版權問題請告知我,我會將圖撤掉